package cn.jbolt.core.service;

import cn.jbolt.core.base.JBoltMsg;
import cn.jbolt.core.common.enums.JBoltSystemLogTargetType;
import cn.jbolt.core.kit.JBoltUserKit;
import cn.jbolt.core.model.Topnav;
import cn.jbolt.core.model.TopnavMenu;
import cn.jbolt.core.service.base.JBoltBaseService;
import cn.jbolt.core.util.JBoltArrayUtil;
import com.jfinal.aop.Inject;
import com.jfinal.kit.Okv;
import com.jfinal.kit.Ret;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class JBoltTopnavMenuService extends JBoltBaseService<TopnavMenu> {
	protected TopnavMenu dao = new TopnavMenu().dao();
	@Inject
	private JBoltTopnavService topnavService;

	@Override
	protected TopnavMenu dao() {
		return dao;
	}

	/**
	 * 查询顶部导航下的所有菜单列表 一级
	 *
	 * @param topnavId
	 * @return
	 */
	public List<TopnavMenu> getCheckedLeftMenus(Long topnavId) {
		if (notOk(topnavId)) {
			return Collections.emptyList();
		}
		return getCommonList(Okv.by("topnav_id", topnavId));
	}

	/**
	 * 清空一个顶部导航下的所有菜单列表 一级
	 *
	 * @param topnavId
	 * @return
	 */
	public Ret clearTopnavMenus(Long topnavId) {
		return deleteBy(Okv.by("topnav_id", topnavId));
	}

	/**
	 * 提交
	 *
	 * @param topnavId
	 * @param menusStr
	 * @return
	 */
	public Ret submit(Long topnavId, String menusStr) {
		if (notOk(topnavId) || notOk(menusStr)) {
			return fail(JBoltMsg.PARAM_ERROR);
		}
		Topnav topnav = topnavService.findById(topnavId);
		if (topnav == null) {
			return fail("顶部导航信息不存在");
		}
		String[] ids = JBoltArrayUtil.from(menusStr, ",");
		if (ids.length == 0) {
			return fail("请选择分配的菜单");
		}
		// 先删除以前的
		clearTopnavMenus(topnavId);
		// 添加现在的
		saveTopnavMenus(topnavId, ids);
		// 添加日志
		addUpdateSystemLog(topnavId, JBoltUserKit.getUserId(), topnav.getName(),
				"下的菜单");
		return SUCCESS;
	}

	/**
	 * 保存一个顶部导航下的菜单
	 *
	 * @param topnavId
	 * @param ids
	 */
	private void saveTopnavMenus(Long topnavId, String[] ids) {
		List<TopnavMenu> topnavMenus = new ArrayList<TopnavMenu>();
		TopnavMenu menu;
		for (String id : ids) {
			menu = new TopnavMenu();
			menu.autoProcessIdValue();
			menu.setTopnavId(topnavId);
			menu.setPermissionId(Long.parseLong(id));
			topnavMenus.add(menu);
		}
		batchSave(topnavMenus);

	}

	/**
	 * 清空所有配置
	 *
	 * @return
	 */
	public Ret clearAllTopnavMenus() {
		delete(deleteSql().toSql());
		return SUCCESS;
	}

	/**
	 * 删除一个顶部导航下的菜单配置
	 *
	 * @param topnavId
	 */
	public void deleteByTopnavId(Long topnavId) {
		if (isOk(topnavId)) {
			deleteBy(Okv.by("topnav_id", topnavId));
		}
	}

	/**
	 * 检测topnav是否分配菜单
	 *
	 * @param topnavId
	 * @return
	 */
	public boolean checkTopnavUsed(Long topnavId) {
		if (notOk(topnavId)) {
			return false;
		}
		return exists("topnav_id", topnavId);
	}

	@Override
	protected int systemLogTargetType() {
		return JBoltSystemLogTargetType.TOPNAV.getValue();
	}
}
